//
//  StatusPictureView.swift
//  xinlangweibo
//
//  Created by yangshuo on 15/12/5.
//  Copyright © 2015年 yangshuo. All rights reserved.
//

import UIKit
import SDWebImage
//图片之间的间距
private let pictureMargin: CGFloat = 8
private let ReuseIdentifier: String = "fighting"
class StatusPictureView: UICollectionView {
    //微博视图模型
    var viewModel: StatusViewModel?{
        didSet{
            //自动计算大小->修改当前视图的大小bounds
            sizeToFit()
            
             //刷新数据->如果不刷新,后续cellectionview,一旦被复用,不再读取数据源方法
            
            //注意,因为uicollectionView是继承自UItableviewcell,会重用
            //如果不写datareload()的话,显示新cell时加载几次数据源方法后,就会调用重用cell,显示新的cell就不再加载数据源方法,此时图片显示会产生缓存问题
            //而写了datareload()后,每次显示新的cell都会加载数据源方法,避免显示图片缓存问题
            //所以在设置好cell后,千万不要忘了reloadData!!!
            reloadData()
        }
    }
    //sizeToFit本身无法重写,如果想修改视图大小,重写sizeThatFits方法
    //sizeToFit默认调用sizeThatFits方法
    override func sizeThatFits(size: CGSize) -> CGSize {
        return calcViewSize()
    }
//如果在collectionView没有指定一个layout(collectionViewLayout),无法继续!!!->缺少布局参数
    //构造函数
    init(){
     // CGRectZero -> cgrectmake(0,0,0,0)
        //注意collectionview中的layout一定要选择flowLayout!
        let layout = UICollectionViewFlowLayout()
        //格子间距
        layout.minimumInteritemSpacing = pictureMargin
        //行间距
        layout.minimumLineSpacing = pictureMargin
        super.init(frame: CGRectZero, collectionViewLayout: layout)
        backgroundColor = UIColor(white: 0.8, alpha: 1.0)
        
        //\设置数据源 - 自己当自己的数据源,只要可以实现数据源方法,无论谁都可以当数据源!
        //自己当自己数据源的应用场景:自定义视图的小框架
        //还有datasource要写在构造函数中!!
        dataSource = self
        //注册可重用cell(预设uicollectionViewCell)
        //registerClass第一个参数需要写cell的类参数!!!
        //注意:要使用自定义cell,需要在注册时将自定义cell写入到第一个参数中!!
        registerClass(StatusPictureViewCell.self, forCellWithReuseIdentifier: ReuseIdentifier )
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
//MARK: - 计算视图大小
extension StatusPictureView{
    //计算视图大小
    private func  calcViewSize() -> CGSize{
    //每行图片数量
        let rowCount: CGFloat = 3
    //图片视图最大宽度
    let maxWidth = UIScreen.mainScreen().bounds.width - 2 * statusMargin
        //图片宽度
    let itemSize = (maxWidth - 2 * pictureMargin) / rowCount
      
     //2.设置layout的itemsize,九宫格中内部图片大小靠layout来设置
      let layout = collectionViewLayout as! UICollectionViewFlowLayout
        
        layout.itemSize = CGSize(width: itemSize, height: itemSize)//内部图片的大小设置好了!
        
        // 3.获取图片数量,通过图片数量返回size
        let count = viewModel?.thumbnailUrls?.count ?? 0
        //0张图片
        if count == 0 {
            return CGSizeZero
        }
        //TODO: 临时设置储存1张图片的尺寸
        if count == 1{
             let size = CGSize(width: 150, height: 90)
            //显示单张图片的是单独设置itemsize与之前算出来的不一样,所以重新赋值
            layout.itemSize = size
            //配图视图的大小
            return size
        }
        //4张图片
        if count == 4{
            let w = itemSize * 2 + pictureMargin
           return  CGSize(width: w, height: w)
        }
        //9张图片size
        //  2 3
        //  5 6
        //7 8 9
        let row = CGFloat((count - 1) / Int(rowCount) + 1) //这个公式很重要
        let h = row * itemSize + (row - 1) * pictureMargin
        //注意这个地方,如果row = 1 ,count = 2时,配图视图的宽度可以设置为maxWidth,因为,配图视图中内部的图片宽度是固定的!
        let w = rowCount * itemSize + (row - 1) * pictureMargin
        return CGSize(width: w, height: h)
        
        
            }
}
//设置视图显示->指定数据源
//MARK: - 实现数据源方法->不要忘了遵守协议UICollectionViewDataSource
extension StatusPictureView: UICollectionViewDataSource{
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return viewModel?.thumbnailUrls?.count ?? 0
    }
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! StatusPictureViewCell
     cell.imageUrl = viewModel!.thumbnailUrls![indexPath.item]
        
        return cell
    }
    
}
//对于小的cell可以设置私有类(用来获取数据及显示数据的)
private class StatusPictureViewCell: UICollectionViewCell{
    //设置内容
    var imageUrl: NSURL?{
        didSet{
   iconView.sd_setImageWithURL(imageUrl,
    placeholderImage: nil,   //在调用OC框架时,可/毕选要求不严格
    options: [SDWebImageOptions.RetryFailed, //SD时长超过15S,一旦超时会被记入黑名单不再加载,需要使用retryfailed代表失败后重新加载
    SDWebImageOptions.RefreshCached ])//RedreshCached可以解决URL不变,图像变,RedreshCached可以进入服务器获取到最新的图片
            
        }
    }
    //构造函数
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    //设置界面
    private func setupUI(){
        //1添加控件
       contentView.addSubview(iconView)
        //2.设置布局- 因为cell会变化,另外,不同的cell大小可能不一样,设置死图片大小会错误(但如果cell被复用,在构造函数中调用时iconview的frame无法修改,所以iconview的frame不能设置死)
        iconView.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(contentView.snp_edges)
        }
    }
    //懒加载控件
    private lazy var iconView: UIImageView = {
        //闭包形式的懒加载,首先不要忘了实例化!!!
        let iv = UIImageView()
        //设置填充模式
        iv.contentMode = UIViewContentMode.ScaleAspectFill
        //裁剪多余部分
        iv.clipsToBounds = true
        return iv
       
    }()
}
